; int generar_codigo(nodo_arbol_t *a, nodo_arbol_t *h, codigo_t *c);

%include "macros/personalizada.mac"
%include "macros/codigo_t.mac"
%include "macros/nodo_arbol_t.mac"

global generar_codigo

%define ptr_arbol [ebp + 8]
%define ptr_hoja [ebp + 12]
%define ptr_codigo [ebp + 16]

section .text

generar_codigo:
	push ebp
	mov ebp, esp
	push esi
	push edi
	push ebx
	
	xor ebx, ebx ; Aca guardamos el codigo_rev.
	xor ecx, ecx ; Aca guardamos la longitud del codigo en bits.
	
	mov edi, ptr_arbol
	cmp edi, 0
	je error
	
	mov edi, ptr_hoja
	cmp edi, 0
	je error
	
ciclo:
	inc ecx
	cmp ecx, 33
	je error

	cmp edi, 0
	je fin
	
	mov esi, [edi + off_ptr_padre_na]
	cmp esi, 0
	je continuar
	
	; Me fijo si es el izquierdo.
	cmp [esi + off_ptr_izq_na], edi
	je es_izquierdo
	
es_derecho:
	; Agregamos al codigo 0.
	shl ebx, 1
	jmp sigo
	
es_izquierdo:
	; Agregamos al codigo 1.
	shl ebx, 1
	add ebx, 1
	
sigo:
	mov edi, esi
	jmp ciclo
	
continuar:
	mov eax, ptr_codigo
	mov [eax + off_codigo_rev_cod], ebx
	mov [eax + off_long_codigo_cod], ecx
	mov dword [eax + off_valido_cod], valido
	
; Damos vuelta el codigo
	xor edx, edx
invertir:
	rcr ebx, 1
	rcl edx, 1
	loop invertir

	mov [eax + off_codigo_cod], edx
	
	xor eax, eax ; La funcion se ejecuta con exito se retorna 0.
	jmp fin
	
error:
	; Ademas de retornar codigo de error. Retornamos un codigo con codigo invalido.
	mov eax, ptr_codigo
	mov dword [eax + off_codigo_cod], 0
	mov dword [eax + off_codigo_rev_cod], 0
	mov dword [eax + off_long_codigo_cod], 0
	mov dword [eax + off_valido_cod], invalido
	
	mov eax, error_code ; Ocurrio un error se retorna codigo de (error_code)
	
fin:
	pop ebx
	pop edi
	pop esi
	pop ebp
	ret
